#ifndef __SPELER_CONTEXT_H__ 
#define __SPELER_CONTEXT_H__

/****************************************************************************** */	
//	De spelercontext klasse is afgeleid van de observerklasse
//	Ze wordt aan het subject gamecontroll gekoppeld
//	Author: Maarten Lambert, Kenneth Venken
//
/****************************************************************************** */
#include <pthread.h>

#include "Robot.h"
#include "Observer.h"



//! Een speler die dynamisch van type kan veranderen (AI indien connectie wegvalt)

class Speler;
class AiSpeler;
class NetwerkSpeler;

class SpelerContext : public Observer
{
public:
	SpelerContext(const string& color)
		: m_robot( color )

    { 
#ifdef WIN32
	m_mutex = PTHREAD_MUTEX_INITIALIZER;	// dit geeft een compiler waarschuwing bij mij (Kenneth)
#endif
#ifndef WIN32
	pthread_mutex_init (&m_mutex, NULL);
#endif
	  m_status = 0; 
	}

	Robot& getRobot() { return m_robot; }

	// deze mss private maken?
	void setSpeler(AiSpeler* aiSpeler){ m_speler = (Speler*)aiSpeler;}
	void setSpeler(NetwerkSpeler* nwSpeler){ m_speler = (Speler*)nwSpeler;}

	//! Het subject dat deze functie verwacht is een spel
	void update(const Subject* subject);

	/* mutex en cond voor threading */
	pthread_cond_t * getCondMutex(); // cond voor mutex
	pthread_mutex_t *  getMutex();  // mutex voor threads


	// verkrijgen en resette status => ordt vanuit threads opgevraagd
	int getStatus(){ return m_status = 0;}
	void resetStatus() { m_status = 0; }

	// verkrijgen van kaarten
	vector<Kaart*> getRegisters();

	

private:
	Speler* m_speler;
	Robot m_robot;

	/* mutex */
	pthread_mutex_t m_mutex;
	pthread_cond_t m_status_threshold_cv;

	/* status */
	int m_status;
};

#endif

